const Category = require('../models/category.model');
const Video = require('../models/video.model');

// 获取所有分类
exports.getAllCategories = async (req, res) => {
  try {
    const categories = await Category.getAllCategories();
    res.json(categories);
  } catch (error) {
    console.error('获取分类列表失败:', error);
    res.status(500).json({ error: '获取分类列表失败' });
  }
};

// 创建新分类
exports.createCategory = async (req, res) => {
  try {
    // 检查键名是否已存在
    const keyExists = await Category.isKeyExists(req.body.key);
    if (keyExists) {
      return res.status(400).json({ error: '分类键名已存在' });
    }

    const category = new Category({
      ...req.body,
      createdBy: req.user._id
    });

    await category.save();
    await category.populate('createdBy', 'username');

    res.status(201).json(category);
  } catch (error) {
    console.error('创建分类失败:', error);
    if (error.name === 'ValidationError') {
      return res.status(400).json({ error: Object.values(error.errors).map(err => err.message).join(', ') });
    }
    res.status(500).json({ error: '创建分类失败' });
  }
};

// 更新分类
exports.updateCategory = async (req, res) => {
  try {
    const { id } = req.params;
    
    // 检查分类是否存在
    const category = await Category.findById(id);
    if (!category) {
      return res.status(404).json({ error: '分类不存在' });
    }

    // 不允许修改键名
    delete req.body.key;

    // 更新分类信息
    Object.assign(category, req.body);
    category.updatedBy = req.user._id;

    await category.save();
    await category.populate(['createdBy', 'updatedBy'], 'username');

    res.json(category);
  } catch (error) {
    console.error('更新分类失败:', error);
    if (error.name === 'ValidationError') {
      return res.status(400).json({ error: Object.values(error.errors).map(err => err.message).join(', ') });
    }
    res.status(500).json({ error: '更新分类失败' });
  }
};

// 删除分类
exports.deleteCategory = async (req, res) => {
  try {
    const { id } = req.params;

    // 检查分类是否存在
    const category = await Category.findById(id);
    if (!category) {
      return res.status(404).json({ error: '分类不存在' });
    }

    // 检查是否有视频使用此分类
    const videoCount = await Video.countDocuments({ category: id });
    if (videoCount > 0) {
      return res.status(400).json({ 
        error: '无法删除分类',
        message: `该分类下还有 ${videoCount} 个视频，请先移除或重新分类这些视频`
      });
    }

    await category.deleteOne();
    res.json({ message: '分类已删除' });
  } catch (error) {
    console.error('删除分类失败:', error);
    res.status(500).json({ error: '删除分类失败' });
  }
};

// 获取分类详情
exports.getCategoryById = async (req, res) => {
  try {
    const { id } = req.params;
    
    const category = await Category.findById(id)
      .populate('createdBy', 'username')
      .populate('updatedBy', 'username');

    if (!category) {
      return res.status(404).json({ error: '分类不存在' });
    }

    // 获取最新的视频数量
    await category.updateVideoCount();
    res.json(category);
  } catch (error) {
    console.error('获取分类详情失败:', error);
    res.status(500).json({ error: '获取分类详情失败' });
  }
};

// 批量更新分类排序
exports.updateCategoriesOrder = async (req, res) => {
  try {
    const { orders } = req.body; // 格式: [{ id: 'categoryId', order: 1 }, ...]

    if (!Array.isArray(orders)) {
      return res.status(400).json({ error: '无效的请求格式' });
    }

    // 使用事务确保原子性
    const session = await Category.startSession();
    await session.withTransaction(async () => {
      for (const item of orders) {
        await Category.findByIdAndUpdate(
          item.id,
          { 
            order: item.order,
            updatedBy: req.user._id
          },
          { session }
        );
      }
    });

    session.endSession();
    res.json({ message: '分类排序已更新' });
  } catch (error) {
    console.error('更新分类排序失败:', error);
    res.status(500).json({ error: '更新分类排序失败' });
  }
};